require.config({
    baseUrl:"./modules",
    paths:{
        jq: "../libs/jquery",
        "cookie": "../libs/jquery.cookie"
    },
    shim:{
        cookie:{
            deps:["jq"]
        }
    }
})
require(["cookie","getGoods","cartrender","changeLocal","allCheck"],(_cookie,gg,cr,cl,ac)=>{
	//获取本地存储的数据
	let goods = $.cookie("goods") ? JSON.parse($.cookie("goods")) : [];
	const url = "http://localhost:3000/api"
	//获取所有商品数据
	gg(url, "getGoods", res=>{
		console.log(res)
		// 购物车空状态判断和处理
		if(goods.length < 1){
		    $(".cartcenter").html(`<div class="empty">
			       <img src="https://demo6.tp-shop.cn/template/pc/rainbow/static/images/no-login-icon.png" alt="">
			       <p>购物车内暂时没有商品</p>
			   </div>`);
		    return;
		}
		cr($(".cartcenter"),res,goods)
	})
	// 4. 绑定选中状态改变事件
	$(".cartcenter").on("click", ".goodsbox", function(){
		const id=$(this).parent().parent().attr("data-id" );
		const f=this.checked
		// 5. 修改本地存储中的数据
		cl(goods, id, i=>{
		    goods[i].flag = f;
		})
		// 单个选中影响全选
		$("#checkall")[0].checked = goods.every(val=>val.flag);
		// 单个选中，重新计算总数量
		$(".allnum").html( goods.reduce((prev,val)=>prev+(val.flag ? val.num : 0), 0) );
		//单个选中，计算总价
		$(".allprice").html( goods.reduce((prev, val)=>prev+(val.flag ? val.num*val.price : 0), 0) );
	})
	// 6. 绑定输入框的输入事件
	$(".cartcenter").on("input", ".setnum", function(){
	    const id = $(this).parent().parent().attr("data-id");
	    const n = $(this).val()-0;
	    // console.log(id, n);
	    // 6. 修改本地存储中的数据
	    cl(goods, id, i=>{
	        goods[i].num = n;
	    })
	    // 修改单个商品数量，重新计算总数量
	    $(".allnum").html( goods.reduce((prev,val)=>prev+(val.flag ? val.num : 0), 0) );
	    // 总价
	    $(".allprice").html( goods.reduce((prev, val)=>prev+(val.flag ? val.num*val.price : 0), 0) );
		
		//小计
		const pri=$(this).parent().prev().html();
		$(this).parent().next().html(n*pri)
	})
	
	// 7. 绑定删除功能的点击事件
	$(".cartcenter").on("click", ".del", function(){
	    const id = $(this).parent().parent().attr("data-id");
	    $(this).parent().parent().remove();
	    // 8. 修改本地存储中的数据
	    cl(goods, id, i=>{
	        goods.splice(i, 1);
	    })
	    // 单个选中影响全选（删除商品时如果删除了未选中状态的商品行为）
	    $("#checkall")[0].checked = goods.every(val=>val.flag);
	    // // 删除商品时，重新计算总数量
	    $(".allnum").html( goods.reduce((prev,val)=>prev+(val.flag ? val.num : 0), 0) );
	    // // 总价
	    $(".allprice").html( goods.reduce((prev, val)=>prev+(val.flag ? val.num*val.price : 0), 0) );
	})
	// 8. 全选和单个商品选中状态的双向绑定
	// 8.1 全选影响单个选中
	$("#checkall").change(function(){
	    ac(goods, this.checked, $(".goodsbox"));
	    // 修改全选状态，重新计算总数量
	    $(".allnum").html( goods.reduce((prev,val)=>prev+(val.flag ? val.num : 0), 0) );
	    // 总价
	    $(".allprice").html( goods.reduce((prev, val)=>prev+(val.flag ? val.num*val.price : 0), 0) );
	})
	
	// 8.2 单个选中影响全选（初始行为）
	$("#checkall")[0].checked = goods.every(val=>val.flag);
	// 9. 总数量的计算（初始行为）
	let sum = goods.reduce((prev,val)=>prev+(val.flag ? val.num : 0), 0);
	$(".allnum").html( sum );
	// 10. 总价的计算（初始行为）
	$(".allprice").html( goods.reduce((prev, val)=>prev+(val.flag ? val.num*val.price : 0), 0) );
	
	// 11.点击按钮让输入框的数字加减
	$(".cartcenter").on("click", ".btn-add", function(){
		const id = $(this).parent().parent().attr("data-id");
		let num=$(this).prev().val()-0;
		// console.log(typeof $(this).prev().val())
		num++;
		$(this).prev().val(num)
		// 修改本地存储中的数据
		cl(goods, id, i=>{
		    goods[i].num = num;
		});
		//从新计算小计
		const pri=$(this).parent().prev().html();
		$(this).parent().next().html(num*pri);
		// 重新计算总数量
		$(".allnum").html( goods.reduce((prev,val)=>prev+(val.flag ? val.num : 0), 0) );
		// 总价
		$(".allprice").html( goods.reduce((prev, val)=>prev+(val.flag ? val.num*val.price : 0), 0) );
	})
	//减
	$(".cartcenter").on("click", ".btn-sub", function(){
		const id = $(this).parent().parent().attr("data-id");
		let num=$(this).next().val()-0;
		num--;
		$(this).next().val(num);
		// 修改本地存储中的数据
		cl(goods, id, i=>{
		    goods[i].num = num;
		});
		//从新计算小计
		const pri=$(this).parent().prev().html();
		$(this).parent().next().html(num*pri);
		// 重新计算总数量
		$(".allnum").html( goods.reduce((prev,val)=>prev+(val.flag ? val.num : 0), 0) );
		// 总价
		$(".allprice").html( goods.reduce((prev, val)=>prev+(val.flag ? val.num*val.price : 0), 0) );
	})
	
})